﻿//using System;
//using System.Collections.Generic;
//using System.Text;
//using DCRF.Common.Core;
//using DCRF.Common.Primitive;
//using DCRF.BaseBlocks;
//using System.Windows.Forms;
//using Microsoft.CSharp;
//using System.CodeDom.Compiler;
//using System.Reflection;
//using System.IO;
//using DCRF.BaseComponents.Commander;
//using System.Collections;
//using DCRF.Common.Interface;
//using DCRF.Common.Attributes;

//namespace DCRF.BaseBlocks.Commander
//{
//    [BlockId("DCRFCommandBox")]
//    [BlockConnector("Container", typeof(Control))]
//    [BlockConnector("GlobalState", typeof(Hashtable))]
//    public class DCRFCommandBox: BlockBase, IMemScriptHelper
//    {
//        private CmdBox cmdControl = null;
//        private string fullTypeName = "DCRF.BaseBlocks.Commander.MemScript";
//        private Hashtable state = new Hashtable();
//        private List<string> history = new List<string>();

//        //index of history item we are showing, -1 means no history item is shown yet
//        private int historyIndex = -1;

//        //public override BlockInfo BlockInfo
//        //{
//        //    get
//        //    {
//        //        BlockInfo result = new BlockInfo();

//        //        //result.BlockID = new CID("DCRFCommandBox", new BlockVersion(0, 1, 0, 0));
//        //        //result.FriendlyName = "DCRF Box";

//        //        return result;
//        //    }
//        //}


//        public DCRFCommandBox(Guid id, IContainerBlockWeb parent)
//            : base(id, parent)
//        {
//        }

//        public override void InitBlock()
//        {
//            //CreateConnector("Container");
//            //CreateConnector("GlobalState");

//            cmdControl = new CmdBox();

//            SetInput(LoadResource("DCRF.BaseBlocks.Commander.MemScript.cs"));
//        }

//        [BlockService]
//        public void WriteLine(string s)
//        {
//            Write(s);
//            Write("\r\n");
//        }

//        [BlockService]
//        public void Write(string s)
//        {
//            //upon exit this is dosposed
//            if (cmdControl.IsDisposed) return;

//            cmdControl.Invoke(new MethodInvoker(delegate()
//            {
//                cmdControl.Write(s);
//            }));
//        }

//        [BlockService]
//        public void Start()
//        {
//            Control container = Connectors["Container"].Value as Control;

//            container.Invoke(new MethodInvoker(delegate()
//            {
//                container.Controls.Add(cmdControl);
//                cmdControl.Dock = DockStyle.Fill;
//                cmdControl.TabIndex = 0;
//                cmdControl.Focus();
//            }));
//        }

//        [BlockService]
//        public void SetInput(string input)
//        {
//            cmdControl.Input = input;
//        }

//        [BlockService]
//        public string GetInput()
//        {
//            return cmdControl.Input;
//        }

//        [BlockService]
//        public void ClearHistory()
//        {
//            history.Clear();
//            historyIndex = -1;
//        }

//        [BlockService]
//        public void HistoryPrevious()
//        {
//            if (history.Count == 0 || historyIndex == 0) return;
//            if (historyIndex == -1) historyIndex = history.Count;

//            historyIndex--;

//            SetInput(history[historyIndex]);
//        }

//        [BlockService]
//        public void HistoryNext()
//        {
//            if (history.Count == 0 || historyIndex == history.Count-1) return;
//            if (historyIndex == -1) return;

//            historyIndex++;

//            SetInput(history[historyIndex]);
//        }

//        [BlockService]
//        public void Execute()
//        {
//            Execute(false);
//        }

//        [BlockService]
//        public void Execute(bool scheduled)
//        {
//            string code = "";

//            cmdControl.Invoke(new MethodInvoker(delegate()
//                {
//                    code = cmdControl.Input;
//                    cmdControl.Clear();
//                }));

//            ProcessCommand(code, scheduled);
//        }

//        [BlockService]
//        public void Compile(string arg)
//        {
//            string code = "";

//            cmdControl.Invoke(new MethodInvoker(delegate()
//            {
//                code = cmdControl.Input;
//                cmdControl.Clear();
//            }));

//            List<string> err = null;
//            object obj = compileCode(code, out err);

//            if (obj == null)
//            {
//                WriteLine("Error compiling mem-script");
//                foreach (string item in err)
//                {
//                    WriteLine(item);
//                }
//            }
//        }

//        /// <summary>
//        /// </summary>
//        /// <param name="arg"></param>
//        /// <returns></returns>
//        public void ProcessCommand(string arg, bool scheduled)
//        {
//            history.Add(arg);

//            List<string> err = null;
//            object obj = compileCode(arg, out err);

//            if (obj == null)
//            {
//                WriteLine("Error compiling mem-script");
//                foreach (string item in err)
//                {
//                    WriteLine(item);
//                }
//            }
//            else
//            {
//                (obj as IMemScript).main(this);

//                if (!scheduled)
//                {
//                    MessageBox.Show("Execution Finished!");
//                }
//            }
//        }

//        internal static string LoadResource(string name)
//        {
//            Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream(name);

//            return new StreamReader(stream).ReadToEnd();
//        }

//        private object compileCode(string code,out List<string> errors)
//        {
//            errors = new List<string>();

//            CSharpCodeProvider codeProvider = new CSharpCodeProvider();

//            System.CodeDom.Compiler.CompilerParameters parameters = new CompilerParameters();
//            parameters.GenerateInMemory = true;
//            parameters.TreatWarningsAsErrors = false;
//            parameters.GenerateExecutable = false;
//            parameters.CompilerOptions = "/optimize";

//            string[] references = { "System.dll", "mscorlib.dll", "System.Xml.dll", "DCRF.BaseBlocks.dll", "DCRF.Common.dll", "System.Windows.Forms.dll", "System.Drawing.dll" };
//            parameters.ReferencedAssemblies.AddRange(references);

//            CompilerResults results = codeProvider.CompileAssemblyFromSource(parameters, code);

//            if (results.Errors.Count > 0)
//            {
//                foreach (CompilerError error in results.Errors)
//                {
//                    errors.Add("Line " + error.Line.ToString() + ": (" + error.ErrorNumber.ToString() + ")" + error.ErrorText+ " .Line# "+ error.Line);
//                }

//                return null;
//            }
//            else
//            {
//                return results.CompiledAssembly.CreateInstance(fullTypeName);
//            }
//        }

//        public Hashtable State
//        {
//            get
//            {
//                return state;
//            }
//        }

//        public Hashtable GlobalState
//        {
//            get
//            {
//                return Connectors["GlobalState"].Value as Hashtable;
//            }
//        }
//    }
//}
